#ifndef TUPLE_H
#define TUPLE_H

#include "bga/system/ConfigDLL.h"

/**
 * \namespace bga
 * \brief API namespace
 */
namespace bga
{

/**
 * \class Vector
 * \brief this class represents a Typle of N dimensions which contains datas of T
 */
template< unsigned int N, typename T >
class Tuple
{
    public:
        /**
         * Default constructor
         */
        Tuple();

        /**
         * Copy constructor
         * \param tuple : tuple to copy
         */
        Tuple(const Tuple< N, T >& tuple);

        /**
         * Destructor
         */
        virtual ~Tuple();

        /**
         * set the current tuple with an other tuple
         * \param tuple : tuple to copy
         */
        void set(const Tuple< N, T >& tuple);

        /**
         * operator needed to access with easy way to an element in the tuple
         * \param index : index of the element we want to access
         * \return Element accessed
         */
        T& operator[](unsigned int index);

        /**
         * operator needed to access with easy way to an element in the tuple
         * \param index : index of the element we want to access
         * \return Element accessed
         */
        const T& operator[](unsigned int index) const;

        /**
         * operator needed to copy a tuple
         * \param tuple : tuple to copy
         * \return current tuple
         */
        Tuple< N, T >& operator=(const Tuple< N, T >& tuple);

    protected:
        T arrayValues[N]; ///!< Array of the elements of the tuple
};

}

#include "bga/system/Tuple.inl"

#endif // TUPLE_H

